/****************************************************************
 **                                                             *
 ** Nombre: GestorDeCarreras.java                               *
 ** Versión: 1.0.0                                              *
 ** Autor:Alonso Fabian Orozco Perez                            *  
 ** Creado: 13-Feb-2013                                         *
 ** Modificado:                                                 *
 ** Diagrama: GAPIv3.0.0                                        *
 ** Caso de uso: MGC1, MGC2, MGC3                               *
 ****************************************************************/
package Servicios;

import DAO.DAOCarrera;
import DAO.DAOProgramaEducativo;
import Dominio.Carrera;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Proporciona los servicios relacionados con el alta, edición y baja de carreras de la base de datos del sistema.
 * @author amado.cante
 */
public class GestorDeCarreras extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String tipoEvento = request.getParameter("evento");

        if (tipoEvento.equals("registrar")) {
            registrarCarrera(request, response);
        } else {
            if (tipoEvento.equals("modificar")) {
                modificarCarrera(request, response);
            } else {
                if (tipoEvento.equals("eliminar")) {
                    eliminarCarrera(request, response);
                } else {
                    String respuesta = "Servicio no reconocido";
                    out.println(respuesta);
                }
            }
        }
    }

    /**
     * Método que registra una carrera en la base de datos tomando la información recibida en el HttpServletRequest.
     * @param request La petición recibida.
     * @param response La instancia de HttpServletResponse recibida.
     */
    private void registrarCarrera(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        String respuesta = null;
        try {
            out = response.getWriter();
            DAOCarrera db_carrera = new DAOCarrera();
            String nombreCarrera = request.getParameter("nombreC");
            String abreviatura = request.getParameter("abrev");
            Carrera carrera = new Carrera(nombreCarrera, abreviatura);

            if (db_carrera.existeCarrera(carrera)) {
                respuesta = "La carrera ingresada ya existe actualmente."
                        + "<input type='button' value ='Recargar' id='recargar'>";
                out.println(respuesta);
            } else {
                db_carrera.registrarCarrera(carrera);
                respuesta = "La carrera se ha registrado con exito."
                        + "<input type='button' value ='Recargar' id='recargar'>";
                out.println(respuesta);
            }
            db_carrera.cerrarConexionACarrera();
        } catch (IOException ex) {
            System.out.println("Error en servlet Gestor De Carreras.(Registro)");
        } finally {
            out.close();
        }
    }

    /**
     * Método para actualizar la información de nombre y abreviatura de una carrera.
     * Toma los datos nuevos del request recibido así como la clave que identifica la carrera en la base de datos.
     * @param request La petición recibida.
     * @param response La instancia de HttpServletResponse recibida.
     */
    private void modificarCarrera(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        String respuesta = null;
        try {
            out = response.getWriter();
            DAOCarrera db_carrera = new DAOCarrera();
            String nombreActual = request.getParameter("nombreActual");
            String abrevActual = request.getParameter("abrevActual");
            String nombreNuevo = request.getParameter("nombreNuevo");
            String abrevNueva = request.getParameter("abrevNueva");
            String claveCarreraEnCadena = request.getParameter("claveCarrera");

            if (nombreActual != null && abrevActual != null && nombreNuevo != null && abrevNueva != null && claveCarreraEnCadena != null) {

                int claveCarrera = Integer.parseInt(claveCarreraEnCadena);
                Carrera carreraActual = new Carrera(claveCarrera, nombreActual, abrevActual);
                Carrera carreraNueva = new Carrera(claveCarrera, nombreNuevo, abrevNueva);
                if (db_carrera.existeCarrera(carreraNueva)) {
                    respuesta = "La carrera ingresada ya existe actualmente."
                            + "<input type='button' value ='Recargar' id='recargar'>";
                    out.println(respuesta);
                } else {
                    db_carrera.actualizarCarrera(carreraActual, carreraNueva);
                    respuesta = "La carrera se ha guardado con exito."
                            + "<input type='button' value ='Recargar' id='recargar'>";
                    out.println(respuesta);
                }
                db_carrera.cerrarConexionACarrera();
            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }

        } catch (IOException ex) {
            System.out.println("Error en servlet Gestor De Carreras.(Modificacion)");
        } finally {
            out.close();
        }
    }

    /**
     * Método que elimina una carrera de la base de datos identificada mediante la clave de carrera recibida en el request.
     * @param request La petición recibida.
     * @param response La instancia de HttpServletResponse recibida.
     */
    private void eliminarCarrera(HttpServletRequest request, HttpServletResponse response) {
        PrintWriter out = null;
        String respuesta = null;
        try {
            out = response.getWriter();
            DAOCarrera db_carrera = new DAOCarrera();
            String claveCarreraEnCadena = request.getParameter("claveCarrera");

            if (claveCarreraEnCadena != null) {

                int claveCarrera = Integer.parseInt(claveCarreraEnCadena);
                
                DAOProgramaEducativo daoProgramaEducativo = new DAOProgramaEducativo();
                
                if(!daoProgramaEducativo.existeProgramaEducativoConCarrera(claveCarrera)) {
                
                    db_carrera.eliminarCarrera(claveCarrera);
                    respuesta = "La carrera se ha eliminado con exito."
                            + "<input type='button' value ='Recargar' id='recargar'>";
                    out.println(respuesta);
                }
                else {
                    out.println("No se ha podido eliminar la carrera debido a que existe al menos un programa educativo asociada a ella.");
                }
                daoProgramaEducativo.cerrarconexionAProgramas();
                
            } else {
                out.println("Ocurrio un error al procesar la peticion");
            }
        } catch (IOException ex) {
            System.out.println("Error en servlet Gestor De Carreras (Eliminacion).");
        } finally {
            out.close();
        }
    }
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
